#include "graph.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back

mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());

const int N=205,inf=1e9;
int n,lst[N],fa[N],deg[N],mp[N][N],d[N][N],ans[N],vis[N];
bool vs[N][N];
struct Edge{int u,v;};
vector<Edge> E;

int nwnode(){
  ++n;
  lst[n]=LastRoad();
  deg[n]=NumberOfRoads();
  return n;
}

int dfs(int pre){
  int col=Color();
  if(col!=1){
  	Move(LastRoad(),col);
	return col;
  }
  int cur=nwnode();
  fa[cur]=pre;
  if(~pre) E.pb({pre,cur}),vis[pre]=cur;
  
//  cerr<<"dfs : "<<pre<<" -> "<<cur<<" -> "<<lst[cur]<<' '<<deg[cur]<<endl;
  
  vector<int> V,ID;
  for(int i=1;i<=deg[cur];i++) ID.pb(i);
  shuffle(ID.begin(),ID.end(),rd);
  
  for(int i:ID) if(i!=lst[cur]){
  	Move(i,2);
  	if(Color()==1){
  	  Move(LastRoad(),1),V.pb(i);
      continue;
	}
	
	int id=LastRoad(),u=cur;
  	Move(id,2);
  	
  	vector<int> st;
  	st.pb(u);
  	while(1){
  	  assert(~lst[u]);
  	  Move(lst[u],u==cur?3:2),u=fa[u];
	  st.pb(u);
	  if(deg[u]>=id&&vis[u]!=cur){
	  	Move(id,2);
	  	int c=Color();
	  	Move(LastRoad(),c);
	  	if(c==3){
	  	  vis[u]=cur,vs[u][id]=1;
		  break;	
		}
	  }	
	}
	E.pb({u,cur});
	
	for(int j=(int)st.size()-1;j>0;j--) Move(mp[st[j]][st[j-1]],2);
  }
  
  for(int i:V) if(!vs[cur][i]){
  	mp[cur][n+1]=i;
  	Move(i,2);
  	dfs(cur);
  }
  if(~lst[cur]) Move(lst[cur],2);
  return 0;
}

void Inspect(int R){
  dfs(-1);
//  cerr<<"n = "<<n<<' '<<(int)E.size()<<endl;
//  for(auto i:E) cerr<<i.u<<' '<<i.v<<endl;
  for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][j]=i==j?0:inf;
  for(auto i:E) d[i.u][i.v]=d[i.v][i.u]=1;
  for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
  for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(d[i][j]!=inf) ans[d[i][j]]++;
  for(int i=1;i<=R;i++) Answer(i,ans[i]);
}
/*
g++ -std=c++14 -O2 -o graph grader.cpp graph.cpp -Wall
*/
